

//================================================================================
LOCO_FORCE_INLINE Vector4::Vector4(float x_val, float y_val, float z_val, float w_val) : x(x_val), y(y_val), z(z_val), w(w_val)
{

}

//================================================================================
LOCO_FORCE_INLINE Vector4::Vector4(Vector3 const& xyz_vaL, float w_val) : x(xyz_vaL.x), y(xyz_vaL.y), z(xyz_vaL.z), w(w_val)
{

}

//================================================================================
LOCO_FORCE_INLINE Vector4::Vector4(float value) : x(value), y(value), z(value), w(value)
{

}

//================================================================================
LOCO_FORCE_INLINE Vector4 Vector4::operator-() const
{
	return Vector4(-x, -y, -z, -w);
}

//================================================================================
LOCO_FORCE_INLINE Vector4 Vector4::operator+(Vector4 const& in) const
{
	return Vector4(x + in.x, y + in.y, z + in.z, w + in.w);
}

//================================================================================
LOCO_FORCE_INLINE Vector4 Vector4::operator-(Vector4 const& in) const
{
	return Vector4(x - in.x, y - in.y, z - in.z, w - in.w);
}

//================================================================================
LOCO_FORCE_INLINE Vector4 Vector4::operator*(Vector4 const& in) const
{
	return Vector4(x * in.x, y * in.y, z * in.z, w * in.w);
}

//================================================================================
LOCO_FORCE_INLINE Vector4 Vector4::operator/(Vector4 const& in) const
{
	return Vector4(x / in.x, y / in.y, z / in.z, w / in.w);
}

//================================================================================
LOCO_FORCE_INLINE Vector4& Vector4::operator+=(Vector4 const& in)
{
	x += in.x;
	y += in.y;
	z += in.z;
	w += in.w;
	return *this;
}

//================================================================================
LOCO_FORCE_INLINE Vector4& Vector4::operator-=(Vector4 const& in)
{
	x -= in.x;
	y -= in.y;
	z -= in.z;
	w -= in.w;
	return *this;
}

//================================================================================
LOCO_FORCE_INLINE Vector4& Vector4::operator*=(Vector4 const& in)
{
	x *= in.x;
	y *= in.y;
	z *= in.z;
	w *= in.w;
	return *this;
}

//================================================================================
LOCO_FORCE_INLINE Vector4& Vector4::operator/=(Vector4 const& in)
{
	x /= in.x;
	y /= in.y;
	z /= in.z;
	w /= in.w;
	return *this;
}

//================================================================================
LOCO_FORCE_INLINE bool Vector4::operator==(Vector4 const& in) const
{
	return (x == in.x) && (y == in.y) && (z == in.z) && (w == in.w);
}

//================================================================================
LOCO_FORCE_INLINE bool Vector4::operator!=(Vector4 const& in) const
{
	return (x != in.x) || (y != in.y) || (z != in.z) || (w != in.w);
}

//================================================================================
LOCO_FORCE_INLINE bool Vector4::operator>(Vector4 const& in) const
{
	return (x > in.x) && (y > in.y) && (z > in.z) && (w > in.w);
}

//================================================================================
LOCO_FORCE_INLINE bool Vector4::operator<(Vector4 const& in) const
{
	return (x < in.x) && (y < in.y) && (z < in.z) && (w < in.w);
}

//================================================================================
LOCO_FORCE_INLINE bool Vector4::operator>=(Vector4 const& in) const
{
	return (x >= in.x) && (y >= in.y) && (z >= in.z) && (w >= in.w);
}

//================================================================================
LOCO_FORCE_INLINE bool Vector4::operator<=(Vector4 const& in) const
{
	return (x <= in.x) && (y <= in.y) && (z <= in.z) && (w <= in.w);
}

//================================================================================
LOCO_FORCE_INLINE float Vector4::norm() const
{
	return sqrt(x*x + y*y + z*z + w*w);
}

//================================================================================
LOCO_FORCE_INLINE float Vector4::norm3() const
{
	return sqrt(x*x + y*y + z*z);
}

//================================================================================
LOCO_FORCE_INLINE float Vector4::square_norm() const
{
	return x*x + y*y + z*z + w*w;
}

//================================================================================
LOCO_FORCE_INLINE float Vector4::square_norm3() const
{
	return x*x + y*y + z*z;
}

//================================================================================
LOCO_FORCE_INLINE bool Vector4::near_equal(Vector4 const& a, Vector4 const& b, float delta)
{
	return	loco::near_equal(a.x, b.x, delta) &&
			loco::near_equal(a.y, b.y, delta) &&
			loco::near_equal(a.z, b.z, delta) &&
			loco::near_equal(a.w, b.w, delta);
}

//================================================================================
LOCO_FORCE_INLINE Vector4 Vector4::reflection3(Vector4 const& in, Vector4 const& normal)
{
	return in - (normal * (2.f * Vector4::dot3(in, normal)));
}

//================================================================================
LOCO_FORCE_INLINE float Vector4::distance(Vector4 const& a, Vector4 const& b)
{
	return (a - b).norm();
}

//================================================================================
LOCO_FORCE_INLINE float Vector4::distance3(Vector4 const& a, Vector4 const& b)
{
	return (a - b).norm3();
}

//================================================================================
LOCO_FORCE_INLINE float Vector4::square_distance(Vector4 const& a, Vector4 const& b)
{
	return (a - b).square_norm();
}

//================================================================================
LOCO_FORCE_INLINE float Vector4::square_distance3(Vector4 const& a, Vector4 const& b)
{
	return (a - b).square_norm3();
}

//================================================================================
LOCO_FORCE_INLINE float Vector4::dot(Vector4 const& a, Vector4 const& b)
{
	return a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w;
}

//================================================================================
LOCO_FORCE_INLINE float Vector4::dot3(Vector4 const& a, Vector4 const& b)
{
	return a.x*b.x + a.y*b.y + a.z*b.z;
}

//================================================================================
LOCO_FORCE_INLINE Vector4 Vector4::cross3(Vector4 const& a, Vector4 const& b)
{
	return Vector4(a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x, 0.0f);
}

//================================================================================
LOCO_FORCE_INLINE Vector4 Vector4::lerp(Vector4 const& a, Vector4 const& b, float value)
{
	return Vector4(loco::lerp(a.x, b.x, value), loco::lerp(a.y, b.y, value), loco::lerp(a.z, b.z, value), loco::lerp(a.w, b.w, value));
}

//================================================================================
LOCO_FORCE_INLINE Vector4 Vector4::lerp(Vector4 const& a, Vector4 const& b, Vector4 const& value)
{
	return Vector4(loco::lerp(a.x, b.x, value.x), loco::lerp(a.y, b.y, value.y), loco::lerp(a.z, b.z, value.z), loco::lerp(a.w, b.w, value.w));
}

